package ratelimit

import (
	"context"
	"fmt"
	"jk-time/webook/internal/service/sms"
	"jk-time/webook/pkg/limiter"
)

type RateLimitedService struct {
	svc     sms.Service
	limiter limiter.Limiter
}

var ErrLimit = fmt.Errorf("触发了限流")

func NewRateLimitedService(svc sms.Service, limiter limiter.Limiter) sms.Service {
	return &RateLimitedService{svc: svc, limiter: limiter}
}
func (s *RateLimitedService) Send(ctx context.Context, tplId string, args []string, numbers ...string) error {
	limited, err := s.limiter.Limit(ctx, "sms:tencent")
	if err != nil {
		//系统错误
		//可以限流：保守策略，你下游很坑时
		//可以不限：业务可用性要求很高，尽量容错策略
		return fmt.Errorf("短信服务判断是否限流出现问题,%w", err)
	}
	if limited {
		return ErrLimit
	}
	return s.svc.Send(ctx, tplId, args, numbers...)
}
